<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>组合继承</title>
</head>

<body>
    <script>
        // JavaScript 继承-- - 借助构造函数（及call方法）

        function People(name, age) {
            //this指向父构造函数的对象实例
            this.name = name
            this.age = age
            this.eat = function () {
                console.log('人们爱吃饭');
            }
        }

        // Worker 工人  skill 技能
        function Worker(name, age, skill) {
            //本来，this指向父构造函数的对象实例的，但是用了call 后， 里面的this,是把父里的this,修改为子里的this，借用父构造函数继承属性
            People.call(this, name, age)
            // 此时的父里的this 更改为子里的this  可以用断点调试的方法
            console.log(this);

            this.skill = skill
            this.eat = function () {
                console.log('工人多吃点');
            }
        }
        function OldWorker(name, age, skill, time) {
            //Worker.apply(this , arguments) 
            Worker.call(this,name, age, skill);
            this.time = time
            this.eat = function () {
                console.log('迪迦吃什么');
            }
        }
        var oldMan = new OldWorker('迪迦', 500, '动感光波', 0)
        console.log(oldMan);
        oldMan.eat();
        console.log(oldMan.name);

        //总结： 继承      继承者-- 子类 派生类       被继承者--父类 超类 基类
        //方法和属性首先从自己本身找
        // 自己没找到
        // 就找自己继承的构造函数当中找
        // 直到找到为止
        // 如果一直找不到就报错


        // 7.JavaScript 原型链

        function People(name, age) {
            this.name = name
            this.age = age
            this.say = function () {
                console.log('1.郭靖爱说话');
            }
        }
        People.prototype.say = function () {
            console.log('2.黄蓉爱说话');
        }
        People.prototype.walk = function () {
            console.log('2.walking');
        }
        var guoxiang = new People()
        // guoxiang.say()
        function Man(name, age, sex) {
            this.name = name
            this.age = age
            this.sex = sex
            this.say = function () {
                console.log('3.男人爱说话');
            }
        }
        // 让People的原型 作为 Man的原型的原型 {a, b, c, say}      原型的继承
        Man.prototype = Object.create(People.prototype)
        // Man.prototype=new People()
        //Man.prototype.constructor=Man;
        Man.prototype.say = function () {
            console.log('4.有的男人不爱说话');
        }
        Man.prototype.test = function () {
            console.log('4.testing');
        }
        var m = new Man()
        m.say()
        m.walk()
        m.test()
        // guoxiang.test();//报错

    //  原型链
        // 调用方法的时候 会先从自己本身找
        // 本身找不到 就从自己的原型当中
        // 原型当中找不到
        // 就找自己的原型的原型
        // 直到找到为止
        // 如果一直找不到
        // 就报错
    </script>
</body>

</html>